package com.lx.spring.config.config;

import com.lx.spring.config.aop.LogAspects;
import com.lx.spring.config.bean.MathCaculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * AOP: [动态代理]
 *      指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式
 *
 *  1. 导入aop 模块: Spring AOP (spring-aspects)
 *  2. 定义一个业务逻辑类 (MathCalculator) ;在业务逻辑运行的时候将日志进行打印,(方法前 方法后 方法返回 方法异常 方法环绕)
 *  3. 定义一个日志切面类 (LogAspects): 切面类里面的方法需要动态感知 MathCalculator.div() 运行到
 *      通知方法:
 *          前置通知(@Before): logStart
 *          后置通知(@After): logEnd
 *          返回通知(@AfterReturning): logReturn
 *          异常通知(@AfterThrowing): logException
 *          环绕通知(@Around): 动态代理,手动触发目标方法运行( joinPoint.procced() )
 *
 *  4. 给切面类的目标方法标注何时何地运行
 *  5. 将切面类和业务逻辑类 (目标方法所在类) 都加入到容器
 *  6. 必须告诉Spring哪个类是切面类(给切面类上加一个注解 @Aspect)
 *  [7] 给配置类中加上 @EnableAspectJAutoProxy [开启基于注解的aop模式]
 *
 * 三步:
 *  1. 将业务逻辑组件和切面类都加入到容器中,告诉spring哪个是切面类( @Aspect )
 *  2. 在切面类上的每一个通知方法上标注通知注解, 告诉Spring何时何地运行(切点表达式)
 *  3. 开启基于注解的aop模式 @EnableAspectJAutoProxy
 *
 *
 * AOP原理
 *  @EnableAspectJAutoProxy
 *  导入 AspectJAutoProxyRegistrar.class
 *
 */

@EnableAspectJAutoProxy
@Configuration
public class AOPConfig {

    @Bean
    public MathCaculator mathCaculator(){
        return new MathCaculator();
    }

    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }

}
